package com.xbongbong.pro.statistic.result.pojo;

import com.xbongbong.paas.constant.PaasConstant;
import com.xbongbong.paas.toolbox.wrap.BaseDTO;
import com.xbongbong.paas.toolbox.wrap.QueryIgnore;
import com.xbongbong.pro.domain.entity.ChartEntity;
import com.xbongbong.pro.statistic.enums.SystemCodeEnum;
import com.xbongbong.pro.statistic.enums.ValueTypeEnum;
import com.xbongbong.pro.statistic.pojo.FiscalYearTimePojo;
import com.xbongbong.pro.statistic.result.pojo.dto.DepAndUserDTO;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 获取图表结果公共参数pojo
 * @author zcp
 * @version v1.0
 * @date 2019/3/15 21:47
 * @since v1.0
 */
@Getter
@Setter
@ToString
public class ChartResultBasePojo extends BaseDTO {
    private static final long serialVersionUID = 8966743008375694162L;

    /**
     * 标记千人千面请求：千人千面的需要对返回数据按照idIn的顺序封装图表
     * @see com.xbongbong.pro.statistic.enums.ResultFromEnum
     */
    private String from;
    /**
     * 组织架构类型：1员工，2部门
     * @see com.xbongbong.sys.enums.CompanyStructTypeEnum
     */
    private Integer companyStructType;
    /**
     * 筛选的部门id
     */
    private Long checkedDepId = null;
    /**
     * 筛选的员工id
     */
    private String checkedUserId = "";

    /**
     * 是否强制是单选场景。像pk的穿透则必须是单选场景（穿透查看某个人的值）
     */
    private Boolean singleCheck;
    /**
     * 筛选的部门idIn(多选)
     */
    private List<Long> checkedDepIdIn = new ArrayList<>();
    /**
     * 筛选的员工idIn(多选)
     */
    private List<String> checkedUserIdIn = new ArrayList<>();
    /**
     * 筛选的部门和员工id(web端)
     */
    @Getter(onMethod_ = {@QueryIgnore})
    private List<DepAndUserDTO> checkedId;
    /**
     * 筛选的时间参数，包括startMonth、timeType、fromType、year、season、month、weekIndex、day、startTime、endTime
     */
    private FiscalYearTimePojo fiscalYearTimePojo = new FiscalYearTimePojo();
    /**
     * 可以作为销售阶段id、工单模版id、产品id、合同模版id、客户模版id等、分类id
     */
    private Long refId = -1L;
    /**
     * 可以作为第二个refId(下面这个 argTwoId使用在阶段那，前端不好改)
     */
    private Long refTwoId = -1L;
    /**
     * 二层筛选id，可以配合refId。比如阶段筛选formId + stageProcessId
     */
    private Long argTwoId;
    /**
     * 字符串数组筛选，可以配合refId。比如阶段筛选formId + 多个code（阶段code集合）
     */
    private List<String> argStrIn;
    /**
     * 模糊查询条件
     */
    private String nameLike;
    /**
     * 客户区域（不传，或传china、“全国”，都代表筛选全国）
     */
    private String province;

    /**
     * 是否是完成率pk，系统指标当为完成情况pk时，要过滤考核产品
     */
    private Boolean performancePk = false;

    /**
     * 全局筛选标记
     */
    private Integer global;

    /*--------以下是可以通过其他参数计算出来的--------*/
    /**
     * 图表实体
     */
    private ChartEntity chartEntity;
    /**
     * 系统指标枚举SystemCodeEnum
     */
    private SystemCodeEnum systemCodeEnum;
    /**
     * 数据权限：5：全公司 4：自定义 3：本部门和下属部门，2本部门 1：本人
     * 对应DataPermissionEnum枚举
     */
    private Integer dataPermission;
    /**
     * 通过筛选的部门or员工得到的userId列表（无筛选的时候根据数据权限）
     */
    private List<String> userIdIn = new ArrayList<>();
    /**
     * 筛选的开始时间
     */
    private Integer startTime;
    /**
     * 筛选的结束时间
     */
    private Integer endTime;
    /**
     * 通过筛选的时间维度--转化为对应的每个时间区间段的开始时间，例如筛选了全年，转化为12个月，则该list存放12个月每月的开始时间
     */
    private List<Integer> startTimeList = new ArrayList<>();
    /**
     * 通过筛选的时间维度--转化为对应的每个时间区间段的结束时间，例如筛选了全年，转化为12个月，则该list存放12个月每月的结束时间
     */
    private List<Integer> endTimeList = new ArrayList<>();
    /**
     * 数值类型枚举
     */
    private ValueTypeEnum valueTypeEnum = ValueTypeEnum.VALUE_TYPE;
    /**
     * 万元开关，true开启，false未开启
     * 注：只有部分场景需要处理成万元
     */
    private boolean thousandSwitch;
    /**
     * pk榜范围选择，每一个PK榜对应的员工列表
     */
    private Map<Long, List<String>> chartIdUserListMap = new HashMap<>(PaasConstant.DEFAULT_INITIAL_CAPACITY);

    /**
     * 是否从缓存读取，默认过缓存，这个改造现在只有工作台用到的几处
     */
    private boolean readCache = true;

    /**
     * 记录图表数据有多少个，因为多个子类需要用到，移到父类
     */
    private Integer count;

    /**
     * 方案id，部门pk时必传
     */
    private Long departmentPkId;

    /**
     * 图表id数组
     * 格式更改，不能直接用来作为查库条件
     */
    @Getter(onMethod_ = {@QueryIgnore})
    private List<ChartIdPojo> chartIdIn;

    /**
     * 系统图表id数组
     */
    @Getter(onMethod_ = {@QueryIgnore})
    private List<Long> sysIdIn;

    /**
     * 自定义图表id数组
     */
    @Getter(onMethod_ = {@QueryIgnore})
    private List<Long> customIdIn;

    /**
     * 系统、自定义区分标志 1为系统 2为自定义
     */
    private Integer statisticsType;

    /**
     * 业绩目标缓存key使用
     */
    @Getter(onMethod_ = {@QueryIgnore})
    private Integer page;

    /**
     * 业绩目标缓存key使用
     */
    @Getter(onMethod_ = {@QueryIgnore})
    private Integer pageSize;

    /**
     * pk缓存使用 - 首页pk `展示全公司top3`  0-开 ， 1-关
     */
    private Integer top3Switch;

    /**
     * 钻取操作，如果为空则未钻取，否则代表进行钻取，需处理聚合字段及筛选条件
     * key：@link DrillFieldEnum
     * value：ChartDrillInfoPojo
     */
    @Getter(onMethod_ = {@QueryIgnore})
    private Map<String, ChartDrillInfoPojo> drill;

}
